package com.relife.core.utils;

import com.relife.common.bean.ExcelParam;
import com.relife.common.http.HttpUtil;
import com.relife.common.model.Page;
import com.relife.core.qbc.QbcQuery;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;



public class ExcelUtil {

	/**
	 * 
	 * @author WU
	 * @date 2016年1月20日 上午11:39:34
	 * @param ep
	 * @param tagId
	 */
	public static void exportExcel(ExcelParam ep, String tagId) {
		HttpUtil.getSession().setAttribute(getExcelTagId(tagId), ep);
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年1月20日 上午11:39:40
	 * @param page
	 * @param qbc
	 * @param sheetName
	 */
	public static void exportExcel(Page page, QbcQuery qbc, String sheetName) {
		ExcelParam ep = getExcelParam(page.getTagId());
		if (ep != null) {
			ep.setQbc(true);
			ep.setQbc(qbc);
			ep.setSheetName(sheetName);
			if (page.getOrderBy() != null) {
				ep.setOrder(page.getOrderBy());
			}
		}
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年1月20日 上午11:39:44
	 * @param page
	 * @param sql
	 * @param param
	 * @param sheetName
	 */
	public static void exportExcel(Page page, String sql, List<Object> param, String sheetName) {
		ExcelParam ep = getExcelParam(page.getTagId());
		ep.setQbc(false);
		ep.setSql(sql);
		ep.setParam(param);
		ep.setSheetName(sheetName);
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年1月20日 上午11:39:48
	 * @param page
	 * @param sql
	 * @param sheetName
	 */
	public static void exportExcel(Page page, String sql, String sheetName) {
		ExcelParam ep = getExcelParam(page.getTagId());
		ep.setQbc(false);
		ep.setSql(sql);
		ep.setSheetName(sheetName);
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年1月20日 上午11:39:55
	 * @param tagId
	 * @return
	 */
	public static ExcelParam getExcelParam(String tagId) {
		return (ExcelParam) HttpUtil.getSession().getAttribute(getExcelTagId(tagId));
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年1月20日 上午11:39:59
	 * @param tagId
	 * @return
	 */
	private static String getExcelTagId(String tagId) {
		return HttpUtil.getSession().getId() + tagId;
	}

	/**
	 * 
	 * @Title: ReadExcelByJxl
	 * @Description: 用jxl读取Excel
	 * @param file
	 * @return
	 * @throws Exception
	 *             List<List<String>>
	 * @throws @exception
	 * @author fly
	 * @date 2015年11月4日 上午11:06:49
	 */
	public static List<List<String>> ReadExcelByJxl(File file) throws Exception {
		List<List<String>> list = new ArrayList<List<String>>();
		jxl.Workbook workbook = jxl.Workbook.getWorkbook(file);
		jxl.Sheet sheet = workbook.getSheet(0);
		if (sheet != null) {
			int rows = sheet.getRows();
			int cells = sheet.getColumns();
			for (int i = 1; i < rows; i++) {
				List<String> exRow = new ArrayList<String>();
				for (int j = 0; j < cells; j++) {
					exRow.add(sheet.getCell(j, i).getContents());
				}
				list.add(exRow);
			}
		}
		return list;
	}

	/**
	 * 获取excle数据，兼容2003/2007格式
	 * 
	 * @Title: ReadExcel
	 * @Description: 文件导入
	 * @return List
	 * @throws @exception
	 * @author fly
	 * @date 2015年11月4日 上午11:07:05
	 */
	public static List<List<String>> ReadExcel(InputStream file) throws Exception {
		List<List<String>> list = new ArrayList<List<String>>();
		Workbook workbook = null;
		Sheet sheet = null;

		// FileInputStream is;
		// is = new FileInputStream(file);
		workbook = WorkbookFactory.create(file);
		for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
			sheet = workbook.getSheetAt(numSheet);
			if (sheet == null) {
				continue;
			}
			for (int i = 1; i <= sheet.getLastRowNum(); i++) {
				Row row = sheet.getRow(i);
				List<String> celllist = new ArrayList<String>();
				if (row == null) {
					continue;
				}
				for (int j = 0; j < row.getLastCellNum(); j++) {
					Cell cell = row.getCell(j);
					if (cell != null) {
						celllist.add(getValue(cell));
					} else {
						celllist.add("");
					}

				}
				list.add(celllist);
			}
		}

		return list;
	}

	/**
	 * 获取excle数据，兼容2003/2007格式
	 * 
	 * @Title: ReadExcel
	 * @Description: 参数为文件
	 * @param file
	 * @return List<List<String>>
	 * @throws @exception
	 * @author fly
	 * @throws IOException
	 * @date 2015年11月4日 上午11:28:16
	 */
	public static List<List<String>> ReadExcel(File file) throws Exception {
		List<List<String>> list = new ArrayList<List<String>>();
		Workbook workbook = null;
		Sheet sheet = null;
		workbook = WorkbookFactory.create(file);
		for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
			sheet = workbook.getSheetAt(numSheet);
			if (sheet == null) {
				continue;
			}
			for (int i = 1; i <= sheet.getLastRowNum(); i++) {
				Row row = sheet.getRow(i);
				List<String> celllist = new ArrayList<String>();
				if (row == null) {
					continue;
				}
				for (int j = 0; j < row.getLastCellNum(); j++) {
					Cell cell = row.getCell(j);
					if (cell != null) {
						celllist.add(getValue(cell));
					} else {
						celllist.add("");
					}

				}
				list.add(celllist);
			}
		}

		return list;
	}

	/**
	 * 获取excel单元格的值
	 * 
	 * @Title: getValue
	 * @Description:
	 * @param cell
	 * @return String
	 * @throws @exception
	 * @author fly
	 * @date 2015年11月4日 上午11:03:53
	 */
	private static String getValue(Cell cell) {
		DecimalFormat sf = new DecimalFormat("###.####");
		// 空值
		if (cell.getCellType() == Cell.CELL_TYPE_BLANK) {
			return "";

		} else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
			// 返回布尔类型的值
			return String.valueOf(cell.getBooleanCellValue());

		} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {

			// 如果是日期类型的值，则返回日期字符串
			if (HSSFDateUtil.isCellDateFormatted(cell)) {
				Date date = cell.getDateCellValue();
				return String.valueOf(new SimpleDateFormat("yyyy-MM-dd").format(date));
			}
			// 返回数值类型的值
			return String.valueOf(sf.format(cell.getNumericCellValue()));

			// 公式
		} else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
			return String.valueOf(cell.getNumericCellValue());
		}

		else {
			// 返回字符串类型的值
			return String.valueOf(cell.getStringCellValue());
		}
	}

}
